package cn.zyl.demo.qle;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * QLExpressApplication类说明:
 * <p><a href="https://github.com/alibaba/QLExpress">github-QLExpress基本语法</a></p>
 * <p>特性:</p>
 * <p>1、线程安全，引擎运算过程中的产生的临时变量都是threadLocal类型</p>
 * <p>2、高效执行，比较耗时的脚本编译过程可以缓存在本地机器，运行时的临时变量创建采用了缓冲池的技术，和groovy性能相当</p>
 * <p>3、弱类型脚本语言，和groovy，javascript语法类似，虽然比强类型脚本语言要慢一些，但是使业务的灵活度大大增强</p>
 * <p>4、安全控制,可以通过设置相关运行参数，预防死循环、高危系统api调用等情况</p>
 * <p>5、代码精简，依赖最小，250k的jar包适合所有java的运行环境，在android系统的低端pos机也得到广泛运用。</p>
 * <pre>
 *     QLExpress属于弱类型脚本语言，一般不推荐声明局部变量的类型。语法编译阶段不会做类型校验，也不会做方法的参数校验，所以很灵活。
 *     QLExpress的这套自定义的指令集属于解析执行，RunEnvironment中通过programPoint函数指针的跳转来实现每条指令的逐个计算，通过dataContainer作为栈来存储中间计算结果。
 *     QLExpress定义的指令类型比较少，粒度比较粗，但是足够完成所有的语法功能。
 *     QLExpress整个运算过程是通过threadLocal来保证线程安全的。
 *     QLExpress的脚本编译过程比较耗时，但是是上下文无关的，所以同一个脚本运行缓存之后性能提升非常明显。
 *     QLExpress指令计算运算过程中，基本不会new新对象，是通过缓存池技术来尽量减少资源的消耗。
 *     QLExpress的宏，function，Operator，变量是非常开放的，名字可以为中文字符，也可以随意扩展，还可以通过脚本静态分析出包含哪些变量、函数，很方便的进行二次业务开发。
 *     脚本调用classLoader资源的时候可以import，也可以使用类的全路径，构造函数、静态方法、对象方法、类的字段、函数的不定参数调用统统搞定。
 * </pre>
 * @author z.y.l
 * @version v1.0
 * @date 2020-08-28
 */
@SpringBootApplication
public class QLExpressApplication {
    public static void main(String[] args) {
        //支持 +,-,*,/,<,>,<=,>=,==,!=,<>【等同于!=】,%,mod【取模等同于%】,++,--,
        //in【类似sql】,like【sql语法】,&&,||,!,等操作符
        //支持for，break、continue、if then else 等标准的程序控制逻辑
        //系统自动会import java.lang.*,import java.util.*;
        /*
        不支持try{}catch{}
        不支持java8的lambda表达式
        不支持for循环集合操作for (GRCRouteLineResultDTO item : list)
        弱类型语言，请不要定义类型声明,更不要用 Templete（Map<String,List>之类的）
        array的声明不一样
        min,max,round,print,println,like,in 都是系统默认函数的关键字，请不要作为变量名
        */
        SpringApplication.run(QLExpressApplication.class, args);
    }
}
